/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.sistemafacturacion.gco.ngc;

import com.jjsoft.sistemafacturacion.gco.dao.GenericController;
import com.jjsoft.sistemafacturacion.gco.mdl.Detallefactura;
import com.jjsoft.sistemafacturacion.gco.mdl.Factura;
import com.jjsoft.sistemafacturacion.gco.util.CNumeros;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Johnny
 */
public class FacturaManager {

    GenericController<Factura> controladorFactura = new GenericController<Factura>();
    ArticuloManager am = new ArticuloManager();

    public void guardarFactura(Factura factura) {
        controladorFactura.create(factura);
        for (int i = 0; i < factura.getDetallefacturaList().size(); i++) {
            am.reducirStock(factura.getDetallefacturaList().get(i).getIdArticulo(), factura.getDetallefacturaList().get(i).getCantidad());

        }

    }

    public Factura buscarPorNumero(int numero) {
        try {
            Factura factura = controladorFactura.findWhere(new Factura(), "numero=" + numero).get(0);
            GenericController<Detallefactura> cdt = new GenericController<Detallefactura>();
            List<Detallefactura> listadetalle = cdt.findWhere(new Detallefactura(), "num_factura=" + factura.getNumero());
            factura.setDetallefacturaList(listadetalle);
            return factura;
        } catch (Exception ex) {
            return null;
        }
    }

    public void anularFactura(Factura factura) {
        factura.setEstado(1);
        try {
            controladorFactura.edit(factura);
            for (int i = 0; i < factura.getDetallefacturaList().size(); i++) {
                am.reducirStock(factura.getDetallefacturaList().get(i).getIdArticulo(), factura.getDetallefacturaList().get(i).getCantidad() * -1);

            }
        } catch (Exception ex) {
            System.err.println(ex.getLocalizedMessage());
        }
    }

    public List<Factura> buscarPorCedula(String cedula) {
        return controladorFactura.findWhere(new Factura(), "cedula_cliente='" + cedula + "'");
    }

    public List<Factura> buscarPorFechas(Date fecha1, Date fecha2) {
        String fechaIni = (fecha1.getYear() + 1900) + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate() + " 00:00:00";
        String fechafin = (fecha2.getYear() + 1900) + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate() + " 23:59:59";
        return controladorFactura.findWhere(new Factura(), "fecha>='" + fechaIni + "' and fecha<='" + fechafin + "'");
    }

    public List<Detallefactura> buscarDetalles(Date fecha1, Date fecha2) {
        List<Detallefactura> listaDetalle = new ArrayList<Detallefactura>();
        String fec1 = (fecha1.getYear() + 1900) + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate() + " 0:00:00";
        String fec2 = (fecha2.getYear() + 1900) + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate() + " 23:59:59";
        try {
            List<Factura> listaFacturas = controladorFactura.findWhere(new Factura(), "fecha>='" + fec1 + "' and fecha<='" + fec2 + "'");
            if (listaFacturas != null) {
                for (int i = 0; i < listaFacturas.size(); i++) {
                    for (int j = 0; j < listaFacturas.get(i).getDetallefacturaList().size(); j++) {
                        boolean existe = false;
                        for (int k = 0; k < listaDetalle.size(); k++) {
                            if (listaFacturas.get(i).getDetallefacturaList().get(j).getIdArticulo().equals(listaDetalle.get(k).getIdArticulo()) && CNumeros.redondear(listaFacturas.get(i).getDetallefacturaList().get(j).getPVenta()) == CNumeros.redondear(listaDetalle.get(k).getPVenta())) {
                                existe = true;
                                listaDetalle.get(k).setCantidad(listaDetalle.get(k).getCantidad() + listaFacturas.get(i).getDetallefacturaList().get(j).getCantidad());
                                break;
                            }

                        }
                        if (!existe) {
                            listaDetalle.add(listaFacturas.get(i).getDetallefacturaList().get(j));
                        }
                    }
                }
                for (int i = 0; i < listaDetalle.size(); i++) {
                    for (int j = i; j < listaDetalle.size(); j++) {
                        if (listaDetalle.get(j).getCantidad() > listaDetalle.get(i).getCantidad()) {
                            Detallefactura aux = new Detallefactura();
                            aux.setCantidad(listaDetalle.get(j).getCantidad());
                            aux.setIdArticulo(listaDetalle.get(j).getIdArticulo());
                            aux.setIddetallefactura(listaDetalle.get(j).getIddetallefactura());
                            aux.setNumFactura(listaDetalle.get(j).getNumFactura());
                            aux.setPVenta(listaDetalle.get(j).getPVenta());

                            listaDetalle.get(j).setCantidad(listaDetalle.get(i).getCantidad());
                            listaDetalle.get(j).setIdArticulo(listaDetalle.get(i).getIdArticulo());
                            listaDetalle.get(j).setIddetallefactura(listaDetalle.get(i).getIddetallefactura());
                            listaDetalle.get(j).setNumFactura(listaDetalle.get(i).getNumFactura());
                            listaDetalle.get(j).setPVenta(listaDetalle.get(i).getPVenta());

                            listaDetalle.get(i).setCantidad(aux.getCantidad());
                            listaDetalle.get(i).setIdArticulo(aux.getIdArticulo());
                            listaDetalle.get(i).setIddetallefactura(aux.getIddetallefactura());
                            listaDetalle.get(i).setNumFactura(aux.getNumFactura());
                            listaDetalle.get(i).setPVenta(aux.getPVenta());

                        }

                    }
                }
            }
            return listaDetalle;
        } catch (Exception ex) {
            return null;
        }
    }

    public double buscarIva(Date fecha1, Date fecha2) {
        String fec1 = (fecha1.getYear() + 1900) + "-" + (fecha1.getMonth() + 1) + "-" + fecha1.getDate();
        String fec2 = (fecha2.getYear() + 1900) + "-" + (fecha2.getMonth() + 1) + "-" + fecha2.getDate();
        try {

            List<Factura> listaFacturas = controladorFactura.findWhere(new Factura(), "fecha>='" + fec1 + "' and fecha<='" + fec2 + "'");
            double totalIva = 0;
            if (listaFacturas != null) {

                for (int i = 0; i < listaFacturas.size(); i++) {
                    totalIva += listaFacturas.get(i).getIva();
                }

            }
            return totalIva;

        } catch (Exception ex) {
            return 0;
        }
    }
}
